﻿/**
*                                                        ____   _____
*  Dynarch Calendar -- JSCal2, version 1.9               \  /_  /   /
*  Built at 2011/03/13 10:28 GMT                          \  / /   /
*                                                          \/ /_  /
*  (c) Dynarch.com 2009                                     \  / /
*  All rights reserved.                                       / /
*  Visit www.dynarch.com/projects/calendar for details        \/
*
*/
Calendar = function () {
    /**
    + FIX BUG set focus when calling yearInput.focus(), this will cause un-editable on IOS 
    + Touch devices supported
    */
    var touchIsSupported = ('ontouchstart' in document),
		isIOS = /iP(ad|hone|od)/.test(navigator.userAgent),
		isIOSWithBadTarget = isIOS && (/OS ([6-9]|\d{2})_\d/).test(navigator.userAgent)
    function srcElement(evt) {
        if (isIOSWithBadTarget) {
            /*touch = event.changedTouches[0];
            targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset);*/
        }
        return evt.target || evt.srcElement;
    }
    function defaultNumberConverter(num) { return num; };

    function bm(a) {
        typeof a == "string" && (a = document.getElementById(a));
        return a
    }
    function bk(a, b, c) {
        for (c = 0; c < a.length; ++c) b(a[c])
    }
    function bj() {
        var a = document.documentElement, b = document.body;
        return {
            x: a.scrollLeft || b.scrollLeft,
            y: a.scrollTop || b.scrollTop,
            w: a.clientWidth || window.innerWidth || b.clientWidth,
            h: a.clientHeight || window.innerHeight || b.clientHeight
        }
    }
    function bi(a) {
        var b = 0, c = 0, d = /^div$/i.test(a.tagName), e, f;
        d && a.scrollLeft && (b = a.scrollLeft),
        d && a.scrollTop && (c = a.scrollTop),
        e = { x: a.offsetLeft - b, y: a.offsetTop - c },
        a.offsetParent && (f = bi(a.offsetParent), e.x += f.x, e.y += f.y);
        return e
    }
    function bh(a, b) {
        var c = e ? a.clientX + document.body.scrollLeft : a.pageX,
            d = e ? a.clientY + document.body.scrollTop : a.pageY;

        b && (c -= b.x, d -= b.y);
        return { x: c, y: d }
    }
    function bg(a, b) {
        var c = a.style; b != null && (c.display = b ? "" : "none");
        return c.display != "none"
    }

    function bf(a, b) {
        b === "" ? e ? a.style.filter = "" : a.style.opacity = "" : b != null ? e ? a.style.filter = "alpha(opacity=" + b * 100 + ")" : a.style.opacity = b : e ? /alpha\(opacity=([0-9.])+\)/.test(a.style.opacity) && (b = parseFloat(RegExp.$1) / 100) : b = parseFloat(a.style.opacity);
        return b
    }

    function bd(a, b, c) {
        function h() {
            var b = a.len; a.onUpdate(c / b, d), c == b && g(), ++c
        }
        function g() {
            b && (clearInterval(b), b = null), a.onStop(c / a.len, d)
        }
        function f() {
            b && g(), c = 0, b = setInterval(h, 1e3 / a.fps)
        }
        function d(a, b, c, d) {
            return d ? c + a * (b - c) : b + a * (c - b)
        }
        a = U(a, { fps: 50, len: 15, onUpdate: bl, onStop: bl }), e && (a.len = Math.round(a.len / 2)), f();
        return {
            start: f, stop: g, update: h, args: a, map: d
        }
    }
    function bc(a, b) {
        if (!b(a)) for (var c = a.firstChild; c; c = c.nextSibling) c.nodeType == 1 && bc(c, b)
    }
    function bb(a, b) {
        var c = ba(arguments, 2);
        return b == undefined ? function () {
            return a.apply(this, c.concat(ba(arguments)))
        } : function () {
            return a.apply(b, c.concat(ba(arguments)))
        }
    }
    function ba(a, b) {
        b == null && (b = 0); var c, d, e; try {
            c = Array.prototype.slice.call(a, b)
        } catch (f) {
            c = Array(a.length - b); for (d = b, e = 0; d < a.length; ++d, ++e) c[e] = a[d]
        }
        return c
    }
    function _(a, b, c) {
        var d = null;
        document.createElementNS ? d = document.createElementNS("http://www.w3.org/1999/xhtml", a) : d = document.createElement(a),
        b && (d.className = b), c && c.appendChild(d);
        return d
    }
    function $(a, b, c) {
        if (b instanceof Array) for (var d = b.length; --d >= 0; ) $(a, b[d], c); else Y(b, c, a ? c : null); return a
    }
    function Z(a, b) {
        return Y(a, b, b)
    }
    function Y(a, b, c) {
        if (a) {
            var d = a.className.replace(/^\s+|\s+$/, "").split(/\x20/),
                e = [],
                f;
            for (f = d.length; f > 0; )
                d[--f] != b && e.push(d[f]);
            c && e.push(c), a.className = e.join(" ")
        }

        return c
    }
    function cancelEvent(a) {
        a = a || window.event,
		e ? (a.cancelBubble = !0, a.returnValue = !1) : (a.preventDefault(), a.stopPropagation());

        return !1
    }
    function removeEvent(a, b, c, d) {
        if (a instanceof Array)
            for (var f = a.length; --f >= 0; )
                removeEvent(a[f], b, c);
        else if (typeof b == "object")
            for (var f in b)
                b.hasOwnProperty(f) && removeEvent(a, f, b[f], c);
        else
            a.removeEventListener
				? a.removeEventListener(b, c, e ? !0 : !!d)
				: a.detachEvent
				? a.detachEvent("on" + b, c)
				: a["on" + b] = null;
    }
    function addEvent(a, b, c, d) {
        if (a instanceof Array)
            for (var f = a.length; --f >= 0; )
                addEvent(a[f], b, c, d);
        else if (typeof b == "object")
            for (var f in b)
                b.hasOwnProperty(f) && addEvent(a, f, b[f], c);
        else
            a.addEventListener
			? a.addEventListener(b, c, e ? !0 : !!d)
			: a.attachEvent
			? a.attachEvent("on" + b, c)
			: a["on" + b] = c;
    }
    function U(a, b, c, d) {
        d = {};
        for (c in b)
            b.hasOwnProperty(c) && (d[c] = b[c]);
        for (c in a)
            a.hasOwnProperty(c) && (d[c] = a[c]);
        return d
    }
    function T(a) {
        if (/\S/.test(a)) {
            a = a.toLowerCase();
            function b(b) {
                for (var c = b.length; --c >= 0; )
                    if (b[c].toLowerCase().indexOf(a) == 0)
                        return c + 1
                }
                return b(L("smn")) || b(L("mn"))
            }
        }
        function S(a) {
            if (a) {
                if (typeof a == "number")
                    return P(a);
                if (!(a instanceof Date)) {
                    var b = a.split(/-/);
                    return new Date(parseInt(b[0], 10), parseInt(b[1], 10) - 1, parseInt(b[2], 10), 12, 0, 0, 0)
                }
            }

            return a
        }
        function printDate(a, b) {
            var c = a.getMonth(),
        d = a.getDate(),
        e = a.getFullYear(),
        f = M(a),
        g = a.getDay(),
        h = a.getHours(),
        i = h >= 12,
        j = i ? h - 12 : h,
        k = N(a),
        l = a.getMinutes(),
        m = a.getSeconds(),
        n = /%./g,
        o;
            j === 0 && (j = 12),
    o = {
        "%a": L("sdn")[g],
        "%A": L("dn")[g],
        "%b": L("smn")[c],
        "%B": L("mn")[c],
        "%C": 1 + Math.floor(e / 100),
        "%d": d < 10 ? "0" + d : d,
        "%e": d,
        "%H": h < 10 ? "0" + h : h,
        "%I": j < 10 ? "0" + j : j,
        "%j": k < 10 ? "00" + k : k < 100 ? "0" + k : k,
        "%k": h,
        "%l": j,
        "%m": c < 9 ? "0" + (1 + c) : 1 + c,
        "%o": 1 + c,
        "%M": l < 10 ? "0" + l : l,
        "%n": "\n",
        "%p": i ? "PM" : "AM",
        "%P": i ? "pm" : "am",
        "%s": Math.floor(a.getTime() / 1e3),
        "%S": m < 10 ? "0" + m : m,
        "%t": "\t",
        "%U": f < 10 ? "0" + f : f,
        "%W": f < 10 ? "0" + f : f,
        "%V": f < 10 ? "0" + f : f,
        "%u": g + 1,
        "%w": g,
        "%y": ("" + e).substr(2, 2),
        "%Y": e,
        "%%": "%"
    };
            return toLocalDigit()(b.replace(n, function (a) { return o.hasOwnProperty(a) ? o[a] : a }))
        }
        function Q(a, b, c) {
            var d = a.getFullYear(),
        e = a.getMonth(),
        f = a.getDate(),
        g = b.getFullYear(),
        h = b.getMonth(),
        i = b.getDate();
            return d < g ? -3 : d > g ? 3 : e < h ? -2 : e > h ? 2 : c ? 0 : f < i ? -1 : f > i ? 1 : 0
        }
        function P(a, b, c, d, e) {
            if (!(a instanceof Date)) { a = parseInt(a, 10); var f = Math.floor(a / 1e4); a = a % 1e4; var g = Math.floor(a / 100); a = a % 100, a = new Date(f, g - 1, a, b == null ? 12 : b, c == null ? 0 : c, d == null ? 0 : d, e == null ? 0 : e) } return a
        }
        function O(a) {
            if (a instanceof Date)
                return 1e4 * a.getFullYear() + 100 * (a.getMonth() + 1) + a.getDate();
            if (typeof a == "string")
                return parseInt(a, 10);
            return a;
        }
        function N(a) {
            a = new Date(a.getFullYear(), a.getMonth(), a.getDate(), 12, 0, 0);
            var b = new Date(a.getFullYear(), 0, 1, 12, 0, 0), c = a - b; return Math.floor(c / 864e5)
        }
        function M(a) {
            a = new Date(a.getFullYear(), a.getMonth(), a.getDate(), 12, 0, 0); var b = a.getDay(); a.setDate(a.getDate() - (b + 6) % 7 + 3); var c = a.valueOf(); a.setMonth(0), a.setDate(4); return Math.round((c - a.valueOf()) / 6048e5) + 1
        }
        function L(a, b) {
            var c = i.__.data[a]; b && typeof c == "string" && (c = K(c, b)); return c
        }

        function toLocalDigit() {
            return typeof (L('toLocalDigit')) == 'function' ? L('toLocalDigit') : function (num) { return num; };
        }

        function fromLocalDigit() {
            return typeof (L('fromLocalDigit')) == 'function' ? L('fromLocalDigit') : function (num) { return num; };
        }

        function K(a, b) {
            return a.replace(/\$\{([^:\}]+)(:[^\}]+)?\}/g, function (a, c, d) { var e = b[c], f; d && (f = d.substr(1).split(/\s*\|\s*/), e = (e >= f.length ? f[f.length - 1] : f[e]).replace(/##?/g, function (a) { return a.length == 2 ? "#" : e })); return e })
        }

        function onKeyUp(evt) {
            if (!this._menuAnim) {
                evt = evt || window.event;
                var c = srcElement(evt), e = evt.keyCode, f = evt.charCode || e, g = H[e];
                if (this._menuVisible) {
                    f = String.fromCharCode(f).toLowerCase();
                    if (f >= "0" && f <= "9") {
                        var i = this.els.yearInput;
                        i.value = toLocalDigit()(i.value), i.focus();
                        //return cancelEvent(b)
                    }
                }
            }
        }

        function J(b) {
            if (!this._menuAnim) {
                b = b || window.event;
                var c = srcElement(b), d = c.getAttribute("dyc-btn"), e = b.keyCode, f = b.charCode || e, g = H[e];
                if ("year" == d && e == 13) {
                    var h = new Date(this.date);
                    h.setDate(1), h.setFullYear(this._getInputYear()), this.moveTo(h, !0), z(this, !1);
                    return cancelEvent(b)
                }
                if (this._menuVisible) {
                    //if(f >= "0" && f <= "9")
                    if (e == 27) {
                        z(this, !1);
                        return cancelEvent(b)
                    }

                    // Cancel any key but not number key
                    f = String.fromCharCode(f).toLowerCase();
                    if ((d == 'year') && (f < '0' || f > '9')) {
                        return cancelEvent(b);
                    }
                } else {
                    b.ctrlKey || (g = null), g == null && !b.ctrlKey && (g = I[e]), e == 36 && (g = 0);
                    if (g != null) {
                        y(this, g); return cancelEvent(b)
                    }

                    f = String.fromCharCode(f).toLowerCase();
                    var i = this.els.yearInput, j = this.selection;

                    if (f == " ") {
                        z(this, !0);
                        this.focus();

                        !isIOS && i.focus(), i.select();

                        return cancelEvent(b)
                    }
                    if (f >= "0" && f <= "9") {
                        z(this, !0), this.focus(),
						i.value = toLocalDigit()(f), !isIOS && i.focus();

                        return cancelEvent(b)
                    }

                    var k = L("mn"), l = b.shiftKey ? -1 : this.date.getMonth(), m = 0, n;
                    while (++m < 12) {
                        n = k[(l + m) % 12].toLowerCase();
                        if (n.indexOf(f) == 0) {
                            var h = new Date(this.date); h.setDate(1), h.setMonth((l + m) % 12), this.moveTo(h, !0); return cancelEvent(b)
                        }
                    }

                    if (e >= 37 && e <= 40) {
                        var h = this._lastHoverDate;
                        if (!h && !j.isEmpty()) {
                            h = e < 39 ? j.getFirstDate() : j.getLastDate();
                            if (h < this._firstDateVisible || h > this._lastDateVisible) h = null
                        }

                        if (!h) h = e < 39 ? this._lastDateVisible : this._firstDateVisible;
                        else {
                            var o = h; h = P(h);
                            var l = 100;
                            while (l-- > 0) {
                                switch (e) {
                                    case 37: h.setDate(h.getDate() - 1); break;
                                    case 38: h.setDate(h.getDate() - 7); break;
                                    case 39: h.setDate(h.getDate() + 1); break;
                                    case 40: h.setDate(h.getDate() + 7)
                                }
                                if (!this.isDisabled(h)) break
                            }

                            h = O(h),
                    (h < this._firstDateVisible || h > this._lastDateVisible) && this.moveTo(h)
                        }
                        Y(this._getDateDiv(o), Z(this._getDateDiv(h), "DynarchCalendar-hover-date")), this._lastHoverDate = h;
                        return cancelEvent(b)
                    }
                    if (e == 13 && this._lastHoverDate) {
                        j.type == a.SEL_MULTIPLE && (b.shiftKey || b.ctrlKey) ? (b.shiftKey && this._selRangeStart && (j.clear(!0), j.selectRange(this._selRangeStart, this._lastHoverDate)), b.ctrlKey && j.set(this._selRangeStart = this._lastHoverDate, !0)) : j.reset(this._selRangeStart = this._lastHoverDate);
                        return cancelEvent(b)
                    }
                    e == 27 && !this.args.cont && this.hide()
                }
            }
        }
        function G() {
            this.refresh();
            var a = this.inputField,
        b = this.selection;
            if (a) {
                var c = b.print(this.dateFormat);
                /input|textarea/i.test(a.tagName) ? a.value = c : a.innerHTML = c
            }
            this.callHooks("onSelect", this, b)
        }
        function F(a) {
            a = a || window.event;
            var b = C(a);
            if (b) {
                var c = b.getAttribute("dyc-btn"),
            d = b.getAttribute("dyc-type"),
            e = a.wheelDelta ? a.wheelDelta / 120 : -a.detail / 3;
                e = e < 0 ? -1 : e > 0 ? 1 : 0, this.args.reverseWheel && (e = -e);
                if (/^(time-(hour|min))/.test(d)) {
                    switch (RegExp.$1) {
                        case "time-hour": this.setHours(this.getHours() + e);
                            break;
                        case "time-min":
                            this.setMinutes(this.getMinutes() + this.args.minuteStep * e)
                    }
                    cancelEvent(a)
                }
                else
                    /Y/i.test(c) && (e *= 2), y(this, -e), cancelEvent(a)
            }
        }
        function E(a, b) {
            b = b || window.event;
            var c = C(b);
            if (c) {
                var d = c.getAttribute("dyc-type");
                if (d && !c.getAttribute("disabled"))
                    if (!a || !this._bodyAnim || d != "date") {
                        var e = c.getAttribute("dyc-cls");
                        e = e ? D(e, 0) : "DynarchCalendar-hover-" + d,
                (d != "date" || this.selection.type) && $(a, c, e),
                d == "date" && ($(a, c.parentNode.parentNode, "DynarchCalendar-hover-week"),
                this._showTooltip(c.getAttribute("dyc-date"))),
                /^time-hour/.test(d) && $(a, this.els.timeHour, "DynarchCalendar-hover-time"),
                /^time-min/.test(d) && $(a, this.els.timeMinute, "DynarchCalendar-hover-time"),
                Y(this._getDateDiv(this._lastHoverDate), "DynarchCalendar-hover-date"),
                this._lastHoverDate = null
                    }
            }
            a || this._showTooltip()
        }
        function D(a, b) {
            return "DynarchCalendar-" + a.split(/,/)[b]
        }
        function C(a) {
            var b = srcElement(a), c = b; while (b && b.getAttribute && !b.getAttribute("dyc-type")) b = b.parentNode; return b.getAttribute && b || c
        }
        function B(a) {
            a = a || window.event; var b = this.els.topCont.style, c = bh(a, this._mouseDiff); b.left = c.x + "px", b.top = c.y + "px"
        }
        function A(b, c) {
            c = c || window.event;
            var d = C(c);
            if (d && !d.getAttribute("disabled")) {
                var f = d.getAttribute("dyc-btn"),
            g = d.getAttribute("dyc-type"),
            h = d.getAttribute("dyc-date"),
            i = this.selection,
            j,
            k = {
                mouseover: cancelEvent,
                mousemove: cancelEvent,
                mouseup: function (a) {
                    var b = d.getAttribute("dyc-cls");
                    b && Y(d, D(b, 1)), clearTimeout(j), removeEvent(document, k, !0), k = null
                }
            };
                if (touchIsSupported) {
                    k = {
                        //touchstart: cancelEvent,
                        touchend: function (a) {
                            var b = d.getAttribute("dyc-cls");
                            b && Y(d, D(b, 1)), clearTimeout(j), removeEvent(document, k, !0), k = null
                        } //,
                        //touchmove: cancelEvent
                    };
                }
                if (b) {
                    setTimeout(bb(this.focus, this), 1);
                    var l = d.getAttribute("dyc-cls");
                    l && Z(d, D(l, 1));
                    if ("menu" == f) this.toggleMenu();
                    else if (d && /^[+-][MY]$/.test(f))
                        if (y(this, f)) {
                            var m = bb(function () {
                                y(this, f, !0) ? j = setTimeout(m, 40) : (k[touchIsSupported ? 'touchend' : 'mouseup'](), y(this, f))
                            }, this); j = setTimeout(m, 350), addEvent(document, k, !0)
                        }
                        else
                            k[touchIsSupported ? 'touchend' : 'mouseup']();
                    else if ("year" == f) {
                        if (!isIOS/* && !(/DynarchCalendar-menu-year-focused/ig.test(this.els.yearInput.className))*/) {
                            this.els.yearInput.focus(), this.els.yearInput.select();
                        } else {
                            return true;
                        }
                    }
                    else if (g == "time-am")
                        addEvent(document, k, !0);
                    else if (/^time/.test(g)) {
                        var m = bb(function (a) {
                            w.call(this, a),
                        j = setTimeout(m, 100)
                        }, this, g);
                        w.call(this, g),
                    j = setTimeout(m, 350),
                    addEvent(document, k, !0)
                    }
                    else
                        h && i.type && (i.type == a.SEL_MULTIPLE ? c.shiftKey && this._selRangeStart ? i.selectRange(this._selRangeStart, h) : (!c.ctrlKey && !i.isSelected(h) && i.clear(!0),
                i.set(h, !0),
                this._selRangeStart = h) : (i.set(h),
                this.moveTo(P(h), 2)),
                d = this._getDateDiv(h),
                E.call(this, !0, { target: d })),
                addEvent(document, k, !0);
                    e && k && /dbl/i.test(c.type) && k[touchIsSupported ? 'touchend' : 'mouseup'](),
            !this.args.fixed && /^(DynarchCalendar-(topBar|bottomBar|weekend|weekNumber|menu(-sep)?))?$/.test(d.className) && !this.args.cont && (k[touchIsSupported ? 'touchmove' : 'mousemove'] = bb(B, this),
            this._mouseDiff = bh(c, bi(this.els.topCont)), addEvent(document, k, !0));
                }
                else if ("today" == f)
                    !this._menuVisible && i.type == a.SEL_SINGLE && i.set(new Date), this.moveTo(new Date, !0), z(this, !1);
                else if (/^m([0-9]+)/.test(f)) {
                    var h = new Date(this.date); h.setDate(1), h.setMonth(RegExp.$1), h.setFullYear(this._getInputYear()), this.moveTo(h, !0), z(this, !1)
                } else
                    g == "time-am" && this.setHours(this.getHours() + 12);

                e || cancelEvent(c);
            }
        }
        function z(a, b) {
            a._menuVisible = b,
        $(b, a.els.title, "DynarchCalendar-pressed-title");
            var c = a.els.menu;
            f && (c.style.height = a.els.main.offsetHeight + "px");
            if (!a.args.animation)
                bg(c, b), a.focused && a.focus();
            else {
                a._menuAnim && a._menuAnim.stop();
                var d = a.els.main.offsetHeight;
                f && (c.style.width = a.els.topBar.offsetWidth + "px"),
        b && (c.firstChild.style.marginTop = -d + "px", a.args.opacity > 0 && bf(c, 0), bg(c, !0)),
        a._menuAnim = bd({
            onUpdate: function (e, f) {
                c.firstChild.style.marginTop = f(be.accel_b(e), -d, 0, !b) + "px", a.args.opacity > 0 && bf(c, f(be.accel_b(e), 0, .85, !b))
            },
            onStop: function () {
                a.args.opacity > 0 && bf(c, .85), c.firstChild.style.marginTop = "", a._menuAnim = null, b || (bg(c, !1), a.focused && a.focus())
            }
        })
            }
        }
        function y(a, b, c) {
            this._bodyAnim && this._bodyAnim.stop();
            var d;
            if (b != 0) {
                d = new Date(a.date), d.setDate(1);
                switch (b) {
                    case "-Y": case -2: d.setFullYear(d.getFullYear() - 1); break;
                    case "+Y": case 2: d.setFullYear(d.getFullYear() + 1); break;
                    case "-M": case -1: d.setMonth(d.getMonth() - 1); break;
                    case "+M": case 1: d.setMonth(d.getMonth() + 1)
                }
            }
            else
                d = new Date;
            return a.moveTo(d, !c)
        }
        function w(a) {
            switch (a) { case "time-hour+": this.setHours(this.getHours() + 1); break; case "time-hour-": this.setHours(this.getHours() - 1); break; case "time-min+": this.setMinutes(this.getMinutes() + this.args.minuteStep); break; case "time-min-": this.setMinutes(this.getMinutes() - this.args.minuteStep); break; default: return }
        }
        function v() {
            this._bluringTimeout = setTimeout(bb(u, this), 50)
        }
        function u() {
            this.focused = !1, Y(this.els.main, "DynarchCalendar-focused"), this._menuVisible && z(this, !1), this.args.cont || this.hide(), this.callHooks("onBlur", this)
            this.triggerClicked = false;
        }
        function t() {
            this._bluringTimeout && clearTimeout(this._bluringTimeout), this.focused = !0, Z(this.els.main, "DynarchCalendar-focused"), this.callHooks("onFocus", this)
        }

        // Init Event
        function s(a) {
            var b = _("div"), c = a.els = {}, d;
            if (!touchIsSupported) {
                d = {
                    mousedown: bb(A, a, !0),
                    mouseup: bb(A, a, !1),
                    mouseover: bb(E, a, !0),
                    mouseout: bb(E, a, !1),
                    keypress: bb(J, a)
                };
            } else {
                d = {
                    touchstart: bb(A, a, !0),
                    touchend: bb(A, a, !1),
                    touchmove: bb(E, a, !1),
                    //mouseout: bb(E, a, !1),
                    keypress: bb(J, a)
                };
            }

            a.args.noScroll || (d[g ? "DOMMouseScroll" : "mousewheel"] = bb(F, a));
            e && (d.dblclick = d[touchIsSupported ? 'touchstart' : 'mousedown'], d.keydown = d.keypress);
            b.innerHTML = m(a);
            bc(b.firstChild, function (a) {
                var b = r[a.className]; b && (c[b] = a), e && a.setAttribute("unselectable", "on")
            });
            addEvent(c.main, d);

            addEvent(c.focusLink, a._focusEvents = { focus: bb(t, a), blur: bb(v, a) });
            //isTouchStarted
            addEvent(c.yearInput, a._focusEvents = {
                focus: bb(function () {
                    Z(this.els.yearInput, 'DynarchCalendar-menu-year-focused');
                    t.call(this);
                    this.els.yearInput.select();
                }, a),
                blur: bb(function () {
                    Y(this.els.yearInput, 'DynarchCalendar-menu-year-focused');
                    v.call(this);
                }, a),
                keyup: bb(onKeyUp, a)
            });

            a.moveTo(a.date, !1);
            a.setTime(null, !0);
            if (touchIsSupported && a.args.trigger) {
                addEvent(document, { touchend: bb(function () {
                    if (this.focused && this.triggerClicked === true) v.call(this), this.blur();
                }, a)
                });
            }
            return c.topCont;
        }

        function q(a) {
            function d() {
                c.showTime && (b.push("<td>"), p(a, b), b.push("</td>"))
            }
            var b = [], c = a.args;
            b.push("<table", j, " style='width:100%'><tr>"),
        c.timePos == "left" && d(),
        c.bottomBar && (b.push("<td>"),
        b.push(
            "<table", j,
            "><tr><td>",
            "<div dyc-btn='today' dyc-cls='hover-bottomBar-today,pressed-bottomBar-today' dyc-type='bottomBar-today' ",
            "class='DynarchCalendar-bottomBar-today'>",
            L("today"),
            "</div>",
            "</td></tr></table>"),
        b.push("</td>")),
        c.timePos == "right" && d(),
        b.push("</tr></table>");

            return b.join("")
        }
        function p(a, b) {
            b.push("<table class='DynarchCalendar-time'" + j + "><tr>",
                "<td rowspan='2'><div dyc-type='time-hour' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-hour'></div></td>",
                "<td dyc-type='time-hour+' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-up'></td>",
                "<td rowspan='2' class='DynarchCalendar-time-sep'></td>",
                "<td rowspan='2'><div dyc-type='time-min' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-minute'></div></td>",
                "<td dyc-type='time-min+' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-up'></td>"),
        a.args.showTime == 12 && b.push("<td rowspan='2' class='DynarchCalendar-time-sep'></td>", "<td rowspan='2'><div class='DynarchCalendar-time-am' dyc-type='time-am' dyc-cls='hover-time,pressed-time'></div></td>"),
        b.push("</tr><tr>", "<td dyc-type='time-hour-' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-down'></td>", "<td dyc-type='time-min-' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-down'></td>", "</tr></table>")
        }
        function o(a) {
            var b = [
            "<table height='100%'",
            j,
            "><tr><td>",
            "<table style='margin-top: 1.5em'",
            j,
            ">",
            "<tr><td colspan='3'><input type='text' dyc-btn='year' class='DynarchCalendar-menu-year' size='6' value='",
            a.date.getFullYear(),
            "' /></td></tr>",
            "<tr><td><div dyc-type='menubtn' dyc-cls='hover-navBtn,pressed-navBtn' dyc-btn='today'>",
            L("goToday"),
            "</div></td></tr>",
            "</table>",
            "<p class='DynarchCalendar-menu-sep'>&nbsp;</p>",
            "<table class='DynarchCalendar-menu-mtable'",
            j,
            ">"],
        c = L("smn"),
        d = 0,
        e = b.length,
        f;
            while (d < 12) {
                b[e++] = "<tr>";
                for (f = 4; --f > 0; )
                    b[e++] = "<td><div dyc-type='menubtn' dyc-cls='hover-navBtn,pressed-navBtn' dyc-btn='m"
                + d + "' class='DynarchCalendar-menu-month'>"
                + c[d++] + "</div></td>"; b[e++] = "</tr>"
            }
            b[e++] = "</table></td></tr></table>";

            return b.join("")
        }
        function n(a) {
            return "<div unselectable='on'>" + printDate(a.date, a.args.titleFormat) + "</div>"
        }

        /**
        * Get calendar's header body
        */
        function m(a) {
            // Focus problem: http://snook.ca/archives/accessibility_and_usability/elements_focusable_with_tabindex
            var b = [
            "<table class='DynarchCalendar-topCont'",
            a.args.isRtl ? "style='direction:rtl;'" : "",
            j,
            "><tr><td>",
            "<div class='DynarchCalendar'>",
            e ? "<a tabindex='-1' class='DynarchCalendar-focusLink' href='#'></a>" : "<button tabindex='-1' class='DynarchCalendar-focusLink'></button>",
            "<div class='DynarchCalendar-topBar'>",
            "<div dyc-type='nav' dyc-btn='-Y' dyc-cls='hover-navBtn,pressed-navBtn' ",
            "class='DynarchCalendar-navBtn DynarchCalendar-prevYear'><div></div></div>",
            "<div dyc-type='nav' dyc-btn='+Y' dyc-cls='hover-navBtn,pressed-navBtn' ",
            "class='DynarchCalendar-navBtn DynarchCalendar-nextYear'><div></div></div>",
            "<div dyc-type='nav' dyc-btn='-M' dyc-cls='hover-navBtn,pressed-navBtn' ",
            "class='DynarchCalendar-navBtn DynarchCalendar-prevMonth'><div></div></div>",
            "<div dyc-type='nav' dyc-btn='+M' dyc-cls='hover-navBtn,pressed-navBtn' ",
            "class='DynarchCalendar-navBtn DynarchCalendar-nextMonth'><div></div></div>",
            "<table class='DynarchCalendar-titleCont'",
            j,
            "><tr><td>",
            "<div dyc-type='title' dyc-btn='menu' dyc-cls='hover-title,pressed-title' class='DynarchCalendar-title'>",
            n(a),
            "</div></td></tr></table>",
            "<div class='DynarchCalendar-dayNames'>",
            k(a),
            "</div>",
            "</div>",
            "<div class='DynarchCalendar-body'></div>"];
            (a.args.bottomBar || a.args.showTime) && b.push("<div class='DynarchCalendar-bottomBar'>", q(a), "</div>"),
        b.push("<div class='DynarchCalendar-menu' style='display: none'>",
            o(a),
            "</div>",
            "<div class='DynarchCalendar-tooltip'></div>",
            "</div>",
            "</td></tr></table>");

            return b.join("")
        }
        function renderBody(a, b, c) {
            b = b || a.date, c = c || a.fdow, b = new Date(b.getFullYear(), b.getMonth(), b.getDate(), 12, 0, 0, 0);
            var d = b.getMonth(), e = [], f = 0, g = a.args.weekNumbers; b.setDate(1);
            var h = (b.getDay() - c) % 7;
            h < 0 && (h += 7), b.setDate(0 - h), b.setDate(b.getDate() + 1);
            var i = new Date, k = i.getDate(), l = i.getMonth(), m = i.getFullYear();
            e[f++] = "<table class='DynarchCalendar-bodyTable'" + j + ">";
            for (var n = 0; n < 6; ++n) {
                e[f++] = "<tr class='DynarchCalendar-week",
        n == 0 && (e[f++] = " DynarchCalendar-first-row"),
        n == 5 && (e[f++] = " DynarchCalendar-last-row"),
        e[f++] = "'>",
        g && (e[f++] = "<td class='DynarchCalendar-first-col'><div class='DynarchCalendar-weekNumber'>" + M(b) + "</div></td>");
                for (var o = 0; o < 7; ++o) {
                    var p = b.getDate(),
                q = b.getMonth(),
                r = b.getFullYear(),
                s = 1e4 * r + 100 * (q + 1) + p,
                t = a.selection.isSelected(s),
                u = a.isDisabled(b);
                    e[f++] = "<td class='",
            o == 0 && !g && (e[f++] = " DynarchCalendar-first-col"),
            o == 0 && n == 0 && (a._firstDateVisible = s),
            o == 6 && (e[f++] = " DynarchCalendar-last-col",
            n == 5 && (a._lastDateVisible = s)),
            t && (e[f++] = " DynarchCalendar-td-selected"),
            e[f++] = "'><div dyc-type='date' unselectable='on' dyc-date='" + s + "' ",
            u && (e[f++] = "disabled='1' "),
            e[f++] = "class='DynarchCalendar-day",
            L("weekend").indexOf(b.getDay()) >= 0 && (e[f++] = " DynarchCalendar-weekend"),
            q != d && (e[f++] = " DynarchCalendar-day-othermonth"),
            p == k && q == l && r == m && (e[f++] = " DynarchCalendar-day-today"),
            u && (e[f++] = " DynarchCalendar-day-disabled"),
            t && (e[f++] = " DynarchCalendar-day-selected"),
            u = a.args.dateInfo(b),
            u && u.klass && (e[f++] = " " + u.klass),
            e[f++] = "'>" + toLocalDigit()(p) + "</div></td>",
            b = new Date(r, q, p + 1, 12, 0, 0, 0)
                } e[f++] = "</tr>"
            }

            e[f++] = "</table>";
            return e.join("")
        }

        /**
        * Generate HTML of week
        */
        function k(a) {
            var b = ["<table", j, "><tr>"],
            c = 0; a.args.weekNumbers && b.push("<td><div class='DynarchCalendar-weekNumber'>", L("wk"), "</div></td>");
            while (c < 7) {
                var d = (c++ + a.fdow) % 7;
                b.push("<td><div",
                L("weekend").indexOf(d) >= 0 ? " class='DynarchCalendar-weekend'>" : ">",
                L("sdn")[d],
                "</div></td>")
            }
            b.push("</tr></table>");

            return b.join("")
        }

        // Init() ??
        function a(b) {
            b = b || {},
        this.args = b = U(b, { animation: (!f && !touchIsSupported),
            cont: null,
            bottomBar: !0,
            date: !0,
            fdow: L("fdow"),
            min: null,
            max: null,
            reverseWheel: !1,
            selection: [],
            selectionType: a.SEL_SINGLE,
            weekNumbers: !1,
            align: "Bl/ / /T/r",
            inputField: null,
            trigger: null,
            dateFormat: "%Y-%m-%d",
            fixed: !1,
            opacity: e ? 1 : 3,
            titleFormat: "%b %Y",
            showTime: !1,
            timePos: "right",
            time: !0,
            minuteStep: 5,
            noScroll: !1,
            disabled: bl,
            checkRange: !1,
            dateInfo: bl,
            onChange: bl,
            onSelect: bl,
            onTimeChange: bl,
            onFocus: bl,
            onBlur: bl,
            isRtl: false
        }),
        this.handlers = {};
            var c = this,
            d = new Date;

            b.min = S(b.min),
        b.max = S(b.max),
        b.date === !0 && (b.date = d),
        b.time === !0 && (b.time = d.getHours() * 100 + Math.floor(d.getMinutes() / b.minuteStep) * b.minuteStep),
        this.date = S(b.date),
        this.time = b.time,
        this.fdow = b.fdow,
        bk("onChange onSelect onTimeChange onFocus onBlur".split(/\s+/),
        function (a) {
            var d = b[a]; d instanceof Array || (d = [d]), c.handlers[a] = d
        }),
        this.selection = new a.Selection(b.selection, b.selectionType, G, this);

            var g = s(this);

            b.cont && bm(b.cont).appendChild(g),
        b.trigger && this.manageFields(b.trigger, b.inputField, b.dateFormat)
        }
        var b = navigator.userAgent,
        c = /opera/i.test(b),
        d = /Konqueror|Safari|KHTML/i.test(b),
        e = /msie/i.test(b) && !c && !/mac_powerpc/i.test(b),
        f = e && /msie 6/i.test(b),
        g = /gecko/i.test(b) && !d && !c && !e,
        h = a.prototype,
        i = a.I18N = {};

        a.SEL_NONE = 0,
    a.SEL_SINGLE = 1,
    a.SEL_MULTIPLE = 2,
    a.SEL_WEEK = 3,
    a.dateToInt = O,
    a.intToDate = P,
    a.printDate = printDate,
    a.formatString = K,
    a.i18n = L,
    a.LANG = function (a, b, c) {
        i.__ = i[a] = {
            name: b,
            data: c
        }
    },
    a.setup = function (b) {
        return new a(b)
    },
    h.moveTo = function (a, b) {
        var c = this;

        a = S(a);

        var d = Q(a, c.date, !0),
            e,
            f = c.args,
            g = f.min && Q(a, f.min),
            h = f.max && Q(a, f.max);

        f.animation || (b = !1),
        $(g != null && g <= 1, [c.els.navPrevMonth, c.els.navPrevYear], "DynarchCalendar-navDisabled"),
        $(h != null && h >= -1, [c.els.navNextMonth, c.els.navNextYear], "DynarchCalendar-navDisabled"),
        g < -1 && (a = f.min, e = 1, d = 0),
        h > 1 && (a = f.max, e = 2, d = 0),
        c.date = a, c.refresh(!!b),
        c.callHooks("onChange", c, a, b);

        if (b && (d != 0 || b != 2)) {
            c._bodyAnim && c._bodyAnim.stop();

            var i = c.els.body,
                j = _("div", "DynarchCalendar-animBody-" + x[d], i),
                k = i.firstChild, m = bf(k) || .7,
                n = e ? be.brakes : d == 0 ? be.shake : be.accel_ab2, o = d * d > 4,
                p = o ? k.offsetTop : k.offsetLeft,
                q = j.style,
                r = o ? i.offsetHeight : i.offsetWidth;

            d < 0 ? r += p : d > 0 ? r = p - r : (r = Math.round(r / 7),
            e == 2 && (r = -r));

            if (!e && d != 0) {
                var s = j.cloneNode(!0),
                    t = s.style,
                    u = 2 * r;
                s.appendChild(k.cloneNode(!0)),
                t[o ? "marginTop" : "marginLeft"] = r + "px", i.appendChild(s)
            }

            k.style.visibility = "hidden",
            j.innerHTML = renderBody(c),
            c._bodyAnim = bd({
                onUpdate: function (a, b) {
                    var f = n(a);
                    if (s)
                        var g = b(f, r, u) + "px";
                    if (e)
                        q[o ? "marginTop" : "marginLeft"] = b(f, r, 0) + "px";
                    else {
                        if (o || d == 0)
                            q.marginTop = b(d == 0 ? n(a * a) : f, 0, r) + "px",
                            d != 0 && (t.marginTop = g);
                        if (!o || d == 0)
                            q.marginLeft = b(f, 0, r) + "px", d != 0 && (t.marginLeft = g)
                    }

                    c.args.opacity > 2 && s && (bf(s, 1 - f), bf(j, f))
                },
                onStop: function (b) {
                    i.innerHTML = renderBody(c, a), c._bodyAnim = null
                }
            })
        } c._lastHoverDate = null; return g >= -1 && h <= 1
    },
    h.isDisabled = function (a) {
        var b = this.args; return b.min && Q(a, b.min) < 0 || b.max && Q(a, b.max) > 0 || b.disabled(a)
    },
    h.toggleMenu = function () {
        z(this, !this._menuVisible)
    },
    h.refresh = function (a) {
        var b = this.els; a || (b.body.innerHTML = renderBody(this)),
            b.title.innerHTML = n(this),
            b.yearInput.value = toLocalDigit()(this.date.getFullYear())
    },
    h.redraw = function () {
        var a = this, b = a.els;
        a.refresh(),
        b.dayNames.innerHTML = k(a),
        b.menu.innerHTML = o(a),
        b.bottomBar && (b.bottomBar.innerHTML = q(a)),
        bc(b.topCont, function (c) {
            var d = r[c.className];
            d && (b[d] = c),
            c.className == "DynarchCalendar-menu-year" ? (addEvent(c, a._focusEvents), b.yearInput = c) : e && c.setAttribute("unselectable", "on")
        }),
        a.setTime(null, !0)
    },
    h.setLanguage = function (b) {
        var c = a.setLanguage(b); c && (this.fdow = c.data.fdow, this.redraw())
    },
    a.setLanguage = function (a) {
        var b = i[a]; b && (i.__ = b); return b
    },
    h.focus = function () {
        try {
            this._menuVisible && !isIOS && this.els.yearInput.focus();
            !this._menuVisible && this.els.focusLink.focus();
        } catch (a) { }
        t.call(this)
    },
    h.blur = function () {
        this.els.focusLink.blur(), this.els.yearInput.blur(), u.call(this)
    },
    h.showAt = function (a, b, c) {
        this._showAnim && this._showAnim.stop(), c = c && this.args.animation; var d = this.els.topCont, e = this, f = this.els.body.firstChild, g = f.offsetHeight, h = d.style; h.position = "absolute", h.left = a + "px", h.top = b + "px", h.zIndex = 1e4, h.display = "", c && (f.style.marginTop = -g + "px", this.args.opacity > 1 && bf(d, 0), this._showAnim = bd({ onUpdate: function (a, b) { f.style.marginTop = -b(be.accel_b(a), g, 0) + "px", e.args.opacity > 1 && bf(d, a) }, onStop: function () { e.args.opacity > 1 && bf(d, ""), e._showAnim = null } }))
    },
    h.hide = function () {
        var a = this.els.topCont,
            b = this,
            c = this.els.body.firstChild,
            d = c.offsetHeight,
            e = bi(a).y;
        this.args.animation ? (this._showAnim && this._showAnim.stop(), this._showAnim = bd({ onUpdate: function (f, g) { b.args.opacity > 1 && bf(a, 1 - f), c.style.marginTop = -g(be.accel_b(f), 0, d) + "px", a.style.top = g(be.accel_ab(f), e, e - 10) + "px" }, onStop: function () { a.style.display = "none", c.style.marginTop = "", b.args.opacity > 1 && bf(a, ""), b._showAnim = null } })) : a.style.display = "none", this.inputField = null
    },
    h.popup = function (a, b) {
        function getPosition(b) {
            var c = { x: i.x, y: i.y };
            if (!b) return c;
            /B/.test(b) && (c.y += a.offsetHeight);
            /b/.test(b) && (c.y += a.offsetHeight - f.y);
            /T/.test(b) && (c.y -= f.y);
            /l/.test(b) && (c.x -= f.x - a.offsetWidth);
            /L/.test(b) && (c.x -= f.x);
            /R/.test(b) && (c.x += a.offsetWidth);
            /c/i.test(b) && (c.x += (a.offsetWidth - f.x) / 2);
            /m/i.test(b) && (c.y += (a.offsetHeight - f.y) / 2);
            return c
        }

        a = bm(a);
        b || (b = this.args.align);
        b = b.split(/\x2f/);
        var c = bi(a), d = this.els.topCont, e = d.style, f, g = bj();
        e.visibility = "hidden";
        e.display = "";
        this.showAt(0, 0);
        document.body.appendChild(d);
        f = { x: d.offsetWidth, y: d.offsetHeight };

        var i = c;
        i = getPosition(b[0]);
        i.y < g.y && (i.y = c.y, i = getPosition(b[1]));
        i.x + f.x > g.x + g.w && (i.x = c.x, i = getPosition(b[2]));
        i.y + f.y > g.y + g.h && (i.y = c.y, i = getPosition(b[3]));
        i.x < g.x && (i.x = c.x, i = getPosition(b[4]));
        this.showAt(i.x, i.y, !0);
        e.visibility = "";
        this.focus()
    },
    h.manageFields = function (b, c, d) {
        var e = this;
        c = bm(c),
        b = bm(b),
        /^button$/i.test(b.tagName) && b.setAttribute("type", "button"),
        addEvent(b, "click", function (evt) {
            e.inputField = c, e.dateFormat = d;
            if (e.selection.type == a.SEL_SINGLE) {
                var f, g, h, i;
                f = /input|textarea/i.test(c.tagName) ? c.value : c.innerText || c.textContent,
                f && (g = /(^|[^%])%[bBmo]/.exec(d),
                h = /(^|[^%])%[de]/.exec(d), g && h && (i = g.index < h.index),

                // check if calendar language is Arabic, 
                // Convert number with arabic digits into latin digits
                f = fromLocalDigit()(f),

                f = Calendar.parseDate(f, i),
                f && (e.selection.set(f, !1, !0),
                e.args.showTime && (e.setHours(f.getHours()),
                e.setMinutes(f.getMinutes())),
                e.moveTo(f)));

                e.triggerClicked = true; /*Trick to fix problem of blur event on IOS*/
            }

            e.popup(b)
        })
    },
    h.callHooks = function (a) {
        var b = ba(arguments, 1), c = this.handlers[a], d = 0; for (; d < c.length; ++d) c[d].apply(this, b)
    },
    h.addEventListener = function (a, b) {
        this.handlers[a].push(b)
    },
    h.removeEventListener = function (a, b) {
        var c = this.handlers[a], d = c.length; while (--d >= 0) c[d] === b && c.splice(d, 1)
    },
    h.getTime = function () {
        return this.time
    },
    h.setTime = function (a, b) {
        if (this.args.showTime) { a = a != null ? a : this.time, this.time = a; var c = this.getHours(), d = this.getMinutes(), e = c < 12; this.args.showTime == 12 && (c == 0 && (c = 12), c > 12 && (c -= 12), this.els.timeAM.innerHTML = L(e ? "AM" : "PM")), c < 10 && (c = "0" + c), d < 10 && (d = "0" + d), this.els.timeHour.innerHTML = c, this.els.timeMinute.innerHTML = d, b || this.callHooks("onTimeChange", this, a) }
    },
    h.getHours = function () {
        return Math.floor(this.time / 100)
    },
    h.getMinutes = function () {
        return this.time % 100
    },
    h.setHours = function (a) {
        a < 0 && (a += 24), this.setTime(100 * (a % 24) + this.time % 100)
    },
    h.setMinutes = function (a) {
        a < 0 && (a += 60), a = Math.floor(a / this.args.minuteStep) * this.args.minuteStep, this.setTime(100 * this.getHours() + a % 60)
    },
    h._getInputYear = function () {
        var a = parseInt(fromLocalDigit()(this.els.yearInput.value), 10); isNaN(a) && (a = this.date.getFullYear());
        return a
    },
    h._showTooltip = function (a) {
        var b = "", c, d = this.els.tooltip; a && (a = P(a), c = this.args.dateInfo(a), c && c.tooltip && (b = "<div class='DynarchCalendar-tooltipCont'>" + printDate(a, c.tooltip) + "</div>")), d.innerHTML = b
    };
        var j = " align='center' cellspacing='0' cellpadding='0'",
    r = {
        "DynarchCalendar-topCont": "topCont",
        "DynarchCalendar-focusLink": "focusLink",
        DynarchCalendar: "main",
        "DynarchCalendar-topBar": "topBar",
        "DynarchCalendar-title": "title",
        "DynarchCalendar-dayNames": "dayNames",
        "DynarchCalendar-body": "body",
        "DynarchCalendar-menu": "menu",
        "DynarchCalendar-menu-year": "yearInput",
        "DynarchCalendar-bottomBar": "bottomBar",
        "DynarchCalendar-tooltip": "tooltip",
        "DynarchCalendar-time-hour": "timeHour",
        "DynarchCalendar-time-minute": "timeMinute",
        "DynarchCalendar-time-am": "timeAM",
        "DynarchCalendar-navBtn DynarchCalendar-prevYear": "navPrevYear",
        "DynarchCalendar-navBtn DynarchCalendar-nextYear": "navNextYear",
        "DynarchCalendar-navBtn DynarchCalendar-prevMonth": "navPrevMonth",
        "DynarchCalendar-navBtn DynarchCalendar-nextMonth": "navNextMonth"
    },
    x = { "-3": "backYear", "-2": "back", 0: "now", 2: "fwd", 3: "fwdYear" },
    H = { 37: -1, 38: -2, 39: 1, 40: 2 }, I = { 33: -1, 34: 1 };
        h._getDateDiv = function (a) {
            var b = null;
            if (a)
                try {
                    bc(this.els.body, function (c) {
                        if (c.getAttribute("dyc-date") == a)
                            throw b = c
                    })
                } catch (c) { }

            return b
        },
    (a.Selection = function (a, b, c, d) {
        this.type = b, this.sel = a instanceof Array ? a : [a], this.onChange = bb(c, d), this.cal = d
    }).prototype = {
        get: function () {
            return this.type == a.SEL_SINGLE ? this.sel[0] : this.sel
        },
        isEmpty: function () {
            return this.sel.length == 0
        },
        set: function (b, c, d) {
            var e = this.type == a.SEL_SINGLE; b instanceof Array ? (this.sel = b, this.normalize(), d || this.onChange(this)) : (b = O(b), e || !this.isSelected(b) ? (e ? this.sel = [b] : this.sel.splice(this.findInsertPos(b), 0, b), this.normalize(), d || this.onChange(this)) : c && this.unselect(b, d))
        },
        reset: function () {
            this.sel = [], this.set.apply(this, arguments)
        },
        countDays: function () {
            var a = 0, b = this.sel, c = b.length, d, e, f;
            while (--c >= 0)
                d = b[c],
            d instanceof Array && (e = P(d[0]),
            f = P(d[1]),
            a += Math.round(Math.abs(f.getTime() - e.getTime()) / 864e5)),
            ++a;
            return a;
        },
        unselect: function (a, b) {
            a = O(a);
            var c = !1;
            for (var d = this.sel, e = d.length, f; --e >= 0; ) {
                f = d[e];
                if (f instanceof Array) {
                    if (a >= f[0] && a <= f[1]) {
                        var g = P(a),
                            h = g.getDate();
                        if (a == f[0])
                            g.setDate(h + 1),
                            f[0] = O(g),
                            c = !0;
                        else if (a == f[1])
                            g.setDate(h - 1),
                            f[1] = O(g),
                            c = !0;
                        else {
                            var i = new Date(g);
                            i.setDate(h + 1),
                            g.setDate(h - 1),
                            d.splice(e + 1, 0, [O(i), f[1]]),
                            f[1] = O(g),
                            c = !0
                        }
                    }
                }
                else
                    a == f && (d.splice(e, 1), c = !0)
            }

            c && (this.normalize(), b || this.onChange(this))
        },
        normalize: function () {
            this.sel = this.sel.sort(function (a, b) {
                a instanceof Array && (a = a[0]), b instanceof Array && (b = b[0]); return a - b
            });
            for (var a = this.sel, b = a.length, c, d; --b >= 0; ) {
                c = a[b];
                if (c instanceof Array) {
                    if (c[0] > c[1]) {
                        a.splice(b, 1); continue
                    }

                    c[0] == c[1] && (c = a[b] = c[0])
                }
                if (d) {
                    var e = d,
                        f = c instanceof Array ? c[1] : c;
                    f = P(f),
                    f.setDate(f.getDate() + 1),
                    f = O(f);
                    if (f >= e) {
                        var g = a[b + 1];
                        c instanceof Array && g instanceof Array ? (c[1] = g[1], a.splice(b + 1, 1)) : c instanceof Array ? (c[1] = d, a.splice(b + 1, 1)) : g instanceof Array ? (g[0] = c, a.splice(b, 1)) : (a[b] = [c, g], a.splice(b + 1, 1))
                    }
                }

                d = c instanceof Array ? c[0] : c
            }
        },
        findInsertPos: function (a) {
            for (var b = this.sel, c = b.length, d; --c >= 0; ) { d = b[c], d instanceof Array && (d = d[0]); if (d <= a) break } return c + 1
        },
        clear: function (a) {
            this.sel = [], a || this.onChange(this)
        },
        selectRange: function (b, c) {
            b = O(b),
            c = O(c);
            if (b > c) {
                var d = b;

                b = c, c = d
            }
            var e = this.cal.args.checkRange;
            if (!e) return this._do_selectRange(b, c); try {
                bk((new a.Selection([[b, c]], a.SEL_MULTIPLE, bl)).getDates(), bb(function (a) {
                    if (this.isDisabled(a)) {
                        e instanceof Function && e(a, this); throw "OUT"
                    }
                }, this.cal)),

                this._do_selectRange(b, c)
            } catch (f) { }
        },
        _do_selectRange: function (a, b) {
            this.sel.push([a, b]), this.normalize(), this.onChange(this)
        },
        isSelected: function (a) {
            for (var b = this.sel.length, c; --b >= 0; ) { c = this.sel[b]; if (c instanceof Array && a >= c[0] && a <= c[1] || a == c) return !0 } return !1
        },
        getFirstDate: function () {
            var a = this.sel[0]; a && a instanceof Array && (a = a[0]); return a
        },
        getLastDate: function () {
            if (this.sel.length > 0) { var a = this.sel[this.sel.length - 1]; a && a instanceof Array && (a = a[1]); return a }
        },
        print: function (a, b) {
            var c = [],
                d = 0,
                e,
                f = this.cal.getHours(),
                g = this.cal.getMinutes();

            b || (b = " -> ");

            while (d < this.sel.length)
                e = this.sel[d++],
                e instanceof Array ? c.push(printDate(P(e[0], f, g), a) + b + printDate(P(e[1], f, g), a)) : c.push(printDate(P(e, f, g), a));

            return c
        },
        getDates: function (a) {
            var b = [], c = 0, d, e; while (c < this.sel.length) { e = this.sel[c++]; if (e instanceof Array) { d = P(e[0]), e = e[1]; while (O(d) < e) b.push(a ? printDate(d, a) : new Date(d)), d.setDate(d.getDate() + 1) } else d = P(e); b.push(a ? printDate(d, a) : d) } return b
        }
    },
    a.isUnicodeLetter = function (a) {
        return a.toUpperCase() != a.toLowerCase()
    },
    a.parseDate = function (b, c, d) {
        if (!/\S/.test(b))
            return "";
        b = b.replace(/^\s+/, "").replace(/\s+$/, ""),
        d = d || new Date;

        var e = null,
            f = null,
            g = null,
            h = null,
            i = null,
            j = null,
            k = b.match(/([0-9]{1,2}):([0-9]{1,2})(:[0-9]{1,2})?\s*(am|pm)?/i);
        k && (h = parseInt(k[1], 10),
        i = parseInt(k[2], 10),
        j = k[3] ? parseInt(k[3].substr(1), 10) : 0,
        b = b.substring(0, k.index) + b.substr(k.index + k[0].length),
        k[4] && (k[4].toLowerCase() == "pm" && h < 12 ? h += 12 : k[4].toLowerCase() == "am" && h >= 12 && (h -= 12)));

        var l = function () {
            function k(a) {
                d.push(a)
            }
            function j() {
                var a = "";
                while (g() && /[0-9]/.test(g())) a += f(); if (h(g())) return i(a); return parseInt(a, 10)
            }
            function i(a) {
                while (g() && h(g())) a += f(); return a
            }
            function g() {
                return b.charAt(c)
            }
            function f() {
                return b.charAt(c++)
            }

            var c = 0, d = [], e, h = a.isUnicodeLetter;
            while (c < b.length) e = g(), h(e) ? k(i("")) : /[0-9]/.test(e) ? k(j()) : f();

            return d
        } (),
        m = [];
        for (var n = 0; n < l.length; ++n) {
            var o = l[n]; /^[0-9]{4}$/.test(o) ? (e = parseInt(o, 10), f == null && g == null && c == null && (c = !0)) : /^[0-9]{1,2}$/.test(o) ? (o = parseInt(o, 10), o < 60 ? o < 0 || o > 12 ? o >= 1 && o <= 31 && (g = o) : m.push(o) : e = o) : f == null && (f = T(o))
        }

        m.length < 2 ? m.length == 1 && (g == null ? g = m.shift() : f == null && (f = m.shift())) : c ? (f == null && (f = m.shift()), g == null && (g = m.shift())) : (g == null && (g = m.shift()), f == null && (f = m.shift())), e == null && (e = m.length > 0 ? m.shift() : d.getFullYear()), e < 30 ? e += 2e3 : e < 99 && (e += 1900), f == null && (f = d.getMonth() + 1); return e != null && f != null && g != null ? new Date(e, f - 1, g, h, i, j) : null
    };
        var be = {
            elastic_b: function (a) { return 1 - Math.cos(-a * 5.5 * Math.PI) / Math.pow(2, 7 * a) }, magnetic: function (a) { return 1 - Math.cos(a * a * a * 10.5 * Math.PI) / Math.exp(4 * a) }, accel_b: function (a) { a = 1 - a; return 1 - a * a * a * a }, accel_a: function (a) { return a * a * a }, accel_ab: function (a) { a = 1 - a; return 1 - Math.sin(a * a * Math.PI / 2) }, accel_ab2: function (a) { return (a /= .5) < 1 ? .5 * a * a : -0.5 * (--a * (a - 2) - 1) }, brakes: function (a) { a = 1 - a; return 1 - Math.sin(a * a * Math.PI) }, shake: function (a) { return a < .5 ? -Math.cos(a * 11 * Math.PI) * a * a : (a = 1 - a, Math.cos(a * 11 * Math.PI) * a * a) }
        },
    bl = new Function;
        return a
    } ()